/**
 * 搜索字段转换工具
 * 用于将后台字段配置转换为搜索字段格式
 */

import type {CodegenColumnDTO} from '@/api/codegen'
import type {SearchField} from '@/types/search'

/**
 * 将后台字段配置转换为搜索字段
 * @param columns 后台字段配置列表
 * @returns 搜索字段列表
 */
export function convertColumnsToSearchFields(columns: CodegenColumnDTO[]): SearchField[] {
  return columns
    .filter(column => {
      // 如果showInQuery为true，直接包含
      if (column.showInQuery) return true
      
      // 如果showInQuery为false，但是是常见的查询字段，也包含
      const queryableFields = ['username', 'nickname', 'email', 'mobile', 'status', 'sex', 'sex', 'roleId', 'roleName', 'deptId', 'deptName']
      return queryableFields.includes(column.javaFieldName)
    })
    .map(column => {
      // 处理columnComment，删除括号和括号里的内容
      let label = column.columnComment || column.columnName
      label = label.replace(/[（(][^）)]*[）)]/g, '').trim()
      
      const searchField: SearchField = {
        key: column.javaFieldName,
        label: label,
        type: getSearchFieldType(column),
        operators: getAvailableOperators(column)
      }

      // 如果是枚举类型，添加选项
      if (searchField.type === 'select') {
        searchField.options = getFieldOptions(column)
      }

      return searchField
    })
}

/**
 * 根据字段配置确定搜索字段类型
 * @param column 字段配置
 * @returns 搜索字段类型
 */
function getSearchFieldType(column: CodegenColumnDTO): SearchField['type'] {
  const { columnType, javaFieldType } = column
  
  // 根据Java类型判断
  switch (javaFieldType) {
    case 'Integer':
    case 'Long':
    case 'Double':
    case 'Float':
    case 'BigDecimal':
      return 'number'
    case 'LocalDate':
      return 'date'
    case 'LocalDateTime':
    case 'Date':
      return 'datetime'
    default:
      // 根据数据库类型进一步判断
      if (columnType.toUpperCase().includes('INT') || 
          columnType.toUpperCase().includes('DECIMAL') ||
          columnType.toUpperCase().includes('FLOAT') ||
          columnType.toUpperCase().includes('DOUBLE')) {
        return 'number'
      }
      if (columnType.toUpperCase().includes('DATE')) {
        return columnType.toUpperCase().includes('TIME') ? 'datetime' : 'date'
      }
      // 特殊字段处理：状态、性别等可能是枚举
      if (isEnumField(column)) {
        return 'select'
      }
      return 'text'
  }
}

/**
 * 判断是否为枚举字段
 * @param column 字段配置
 * @returns 是否为枚举字段
 */
function isEnumField(column: CodegenColumnDTO): boolean {
  const { columnName, columnComment } = column
  
  // 根据字段名判断
  const enumFieldNames = ['status', 'state', 'type', 'sex', 'sex', 'level']
  if (enumFieldNames.some(name => columnName.toLowerCase().includes(name))) {
    return true
  }
  
  // 根据注释判断（包含括号说明的字段）
  if (columnComment && columnComment.includes('（') && columnComment.includes('）')) {
    return true
  }
  
  return false
}

/**
 * 获取字段的可用操作符
 * @param column 字段配置
 * @returns 操作符列表
 */
function getAvailableOperators(column: CodegenColumnDTO): string[] {
  const fieldType = getSearchFieldType(column)
  
  switch (fieldType) {
    case 'text':
      return ['eq', 'ne', 'like', 'notLike', 'likeLeft', 'likeRight', 'isNull', 'isNotNull']
    case 'number':
      return ['eq', 'ne', 'gt', 'ge', 'lt', 'le', 'in', 'notIn', 'isNull', 'isNotNull']
    case 'date':
    case 'datetime':
      return ['eq', 'ne', 'gt', 'ge', 'lt', 'le', 'isNull', 'isNotNull']
    case 'select':
      return ['eq', 'ne', 'in', 'notIn', 'isNull', 'isNotNull']
    default:
      return ['eq', 'ne']
  }
}

/**
 * 获取字段选项（用于下拉框）
 * @param column 字段配置
 * @returns 选项列表
 */
function getFieldOptions(column: CodegenColumnDTO): Array<{ label: string; value: any }> {
  const { columnName, columnComment } = column
  
  // 根据字段名和注释生成选项
  if (columnName.toLowerCase().includes('status') || columnName.toLowerCase().includes('state')) {
    if (columnComment && columnComment.includes('0') && columnComment.includes('1')) {
      return [
        { label: '正常', value: 0 },
        { label: '禁用', value: 1 }
      ]
    }
  }
  
  if (columnName.toLowerCase().includes('sex') || columnName.toLowerCase().includes('sex')) {
    return [
      { label: '未知', value: 0 },
      { label: '男', value: 1 },
      { label: '女', value: 2 }
    ]
  }
  
  // 从注释中解析选项
  if (columnComment && columnComment.includes('（') && columnComment.includes('）')) {
    const optionsText = columnComment.match(/（(.+)）/)?.[1]
    if (optionsText) {
      const options: Array<{ label: string; value: any }> = []
      const parts = optionsText.split(/[\s,，]+/)
      
      for (const part of parts) {
        const match = part.match(/(\d+)[：:](\S+)/)
        if (match) {
          const [, value, label] = match
          options.push({ label, value: parseInt(value) })
        }
      }
      
      if (options.length > 0) {
        return options
      }
    }
  }
  
  return []
}

/**
 * 从表配置中提取可查询字段
 * @param tableConfig 表配置
 * @returns 搜索字段列表
 */
export function extractSearchFieldsFromTableConfig(tableConfig: any): SearchField[] {
  if (!tableConfig || !tableConfig.columns) {
    return []
  }
  
  return convertColumnsToSearchFields(tableConfig.columns)
}